package com.jimmy.reggie.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.OSSObject;
import com.jimmy.reggie.common.OssTemplate;
import com.jimmy.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
*@author JimWei
*@date 2022/11/11  16:19
 * 通过浏览器进行文件下载，本质上就是服务端将文件以流的形式写回浏览器的过程。
*/
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
    @Value("${reggie.path}")
    private String path;

    @Autowired
    private OssTemplate ossTemplate;

    /**
     * 将上传的文件存储到本地文件目录下
     * 这里形参传递时，参数名称要和页面file域内的名称一致！！！
     * Oss上传：直接调用工具类API进行上传
     * @param
     * @return
     */
    @PostMapping("/upload")
    public R<String> uploadFiles(MultipartFile file) throws IOException {
        String filePath = ossTemplate.upload(file.getOriginalFilename(), file.getInputStream());
        log.info("文件上传成功,访问地址是:{}", filePath);
        return R.success(filePath);
    }

    /**
     * Oss下载
     * 本质上与本地端读取文件写回到浏览器其实并没有太大的区别
     * 参考阿里云网站上代码将获取客户端对象进行封装，调用工具类API获取client对象，拿到输入流
     * 然后就是IO操作，通过网站的输入流，写到浏览器中
     * 这样，数据库中存储的字段名称依旧还是图片的文件名，不需要进行更改
     * 但是请求路径问题，是由工具类发送给前端，前端再传回来，所以就没有进行更改，以实现功能为主
     * 可以根据需求，进行相应的优化
     * @param name  前端传过来的文件名称
     * @param response   Httpresponse 用来获取输出流对象，打印对应的图片信息
     * @throws IOException IO异常，已经在全局异常处理器中进行处理
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        OSS client = ossTemplate.getClient();
        OSSObject object = client.getObject(ossTemplate.getBucket(), name);
        InputStream bis = object.getObjectContent();
        ServletOutputStream outputStream = response.getOutputStream();
        response.setContentType("image/jpeg");
        int len=0;
        byte[] bytes = new byte[1024];
        while (((len=bis.read(bytes)) != -1)) {
            outputStream.write( bytes,0, len);
            outputStream.flush();
        }
        bis.close();
        outputStream.close();
        //从服务器下载图片
      /*  try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(ossTemplate.getBucket()+name)));
            log.info(path+name);
            ServletOutputStream outputStream = response.getOutputStream();
            response.setContentType("image/jpeg");
            int len=0;
            byte[] bytes = new byte[1024];
            while (((len=bis.read(bytes)) != -1)) {
                outputStream.write( bytes,0, len);
                outputStream.flush();
            }
            bis.close();
            outputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }*/
    }
}
